# 计算优化 : 问题：Python 的动态类型检查、循环计算比 C++ 慢 10~100 倍。
# 不能使用，因为 包 需要install
# import numpy as np
#
# # 计算 10^6 个数的前缀和（比纯 Python 快 50 倍）
# arr = np.array(nums, dtype=np.int32)
# prefix = np.cumsum(arr)

"""不能使用，因为 包 需要install
from numba import njit

@njit
def compute_sum(arr):
    s = 0
    for x in arr:
        s += x
    return s

arr = [1, 2, 3, ..., 10**6]
print(compute_sum(arr))  # 比纯 Python 快 100 倍
"""

# 使用 array.array 替代 list,  优化效果：内存更紧凑，访问速度接近 C 数组。
# 缺点：
import array

arr = array.array('i', [1, 3, 2])  # 'i' 表示 int32  'i' 表示整数，'f' 表示浮点数
arr.append(5)
print(type(arr))
print(type(list(arr)))  # 可以转换为list 使用list中的方法
print(type(sorted(arr)))  # 可以使用快排，但是类型转变为list

print(arr[0])
print(*arr)
# for i in range(len(arr)):
#     arr[i]=1
# print(arr)

# 使用 bisect 替代手写二分
import bisect
sorted_arr = [1, 2, 3, 4, 5]
x=5
idx = bisect.bisect_left(arr, x)  # 比手写二分更稳定
print(idx)

#  使用 collections.deque 替代 list（队列场景）
from collections import deque
q = deque()
q.append(1)  # O(1)
q.popleft()  # O(1)，比 list.pop(0) 的 O(n) 快

# 使用 collections.Counter,defaultdict 替代 dict
from collections import Counter,defaultdict
cnt = Counter()
cnt['a'] += 1  # O(1)
cnt['b'] += 1  # O(1)
print(cnt)


